package de.luisoft.ui.view;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Stack;
import java.util.logging.Logger;

import com.vaadin.data.Property;
import com.vaadin.data.Property.ValueChangeEvent;
import com.vaadin.ui.TwinColSelect;
import com.vaadin.ui.VerticalLayout;

import de.luisoft.ui.model.ProjectModelContainer;

public class TwinPanel extends VerticalLayout implements
		Property.ValueChangeListener {
	private static final Logger log = Logger.getLogger(TwinPanel.class.getName());

	private static final long serialVersionUID = 4826546690443175539L;
	private TwinColSelect l; 
	private Stack<String> stack = new Stack<String>();

	public TwinPanel(ProjectModelContainer p) {
		setSpacing(true);

		l = new TwinColSelect("Bitte mind. 5 Projekte angeben.");
		l.setDescription("In der linken Spalte sind alle Projekte aufgelistet." +
				" Bitte wähle die Projekte der Priorität sortiert nach aus und übertrage" +
				" diese in die rechte Spalte. Das oberste ist automatisch die Erstwahl" +
				", das zweite die Zweitwahl usw.");
		
		l.setContainerDataSource(p);
		l.setRows(6);
		//l.setNullSelectionAllowed(true);
		l.setMultiSelect(true);
		l.setImmediate(true);
		l.addListener(this);
//		l.setLeftColumnCaption("Verfügbare Projekte");
//		l.setRightColumnCaption("Auswahl");
		l.setWidth("400px");
		l.setEnabled(false);
		l.setReadOnly(true);

		addComponent(l);
	}

	private List<String> getSelectedUnordered() {
		Collection c = l.getItemIds();
		log.info("items=" + c);
		List<String> se = new ArrayList<String>();
		for (Object o : c) {
			if (l.isSelected(o)) {
				log.info("selected: " + o.getClass()
						+ ";" + o);
				se.add(o.toString());
			}
		}
		return se;
	}

	public List<String> getAllSelected() {
		List<String> se = new ArrayList<String>(stack);
		return se;
	}

	public void valueChange(ValueChangeEvent event) {
		log.info("ev=" + event);
		TwinColSelect select = (TwinColSelect) event.getProperty();
		List<String> listun = getSelectedUnordered();
		log.info("select=" + select + ";" + listun.size() + ";" + stack.size());
		if (stack.size() > listun.size()) {
			List<String> l1 = new ArrayList<String>(stack);
			boolean b = l1.removeAll(listun);

			stack.removeAll(l1);
		} else if (stack.size() < listun.size()) {
			boolean b = listun.removeAll(stack);
			log.info("listun=" + listun);
			stack.addAll(listun);
		} else {
			throw new IllegalArgumentException("Hopply, somethings rotten here" + stack.size());
		}
		log.info("stack=" + stack);
	}
}
